package cn.ywang.spring.customized.framework.aop;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 只是对application中的expression的封装
 * 目标代理对象的一个方法要增强
 * 由用户自己实现业务逻辑
 * 配置文件的目的：告诉spring，增强功能是对应哪个类的哪个方法
 *
 * @author BeatificWang
 */

public class AopConfig {

	/**
	 * 以目标对象的Method作为key，需要增强的代码内容作为value
	 */
	private Map<Method, Aspect> points = new HashMap<>();

	/**
	 * 存储方法对应的切面方法信息
	 *
	 * @param target 目标方法
	 * @param aspect 定义切面方法的切面对象
	 * @param points 切面方法
	 */
	public void put(Method target, Object aspect, Method[] points) {
		this.points.put(target, new Aspect(aspect, points));
	}

	/**
	 * 获取切面信息
	 *
	 * @param method
	 * @return
	 */
	public Aspect get(Method method) {
		return this.points.get(method);
	}

	public boolean contains(Method method) {
		return this.points.containsKey(method);
	}

	/**
	 * 对增强代码的封装
	 */
	public class Aspect {
		/**
		 * 存储LogAspect对象
		 */
		private Object aspect;
		/**
		 * 存储LogAspect类的before方法和after方法
		 */
		private Method[] points;

		public Aspect(Object aspect, Method[] points) {
			this.aspect = aspect;
			this.points = points;
		}

		public Object getAspect() {
			return this.aspect;
		}

		public void setAspect(Object aspect) {
			this.aspect = aspect;
		}

		public Method[] getPoints() {
			return this.points;
		}

		public void setPoints(Method[] points) {
			this.points = points;
		}
	}
}
